<?php
App::import('Model', 'products.I18nProduct');
class ProductCategory extends AppModel {
	var $name = 'ProductCategory';
	var $useTable = 'product_categories';
	/**
	 * @var $translateModel Translate Model
	 **/
	var $translateModel = 'I18nProduct';
	
	/**
	 * @var $translateTable Translate table
	 **/
	var $translateTable = 'i18n_products';
	
	/**
	 * @var $validate
	 * @brief Biến dùng để ràng buộc dữ liệu đầu vào
	 */
	var $validate = array(
		'name'	=>	array(
			'rule-name-1'	=>	array(
				'rule'	=>	'notempty',
				'message'	=>	"Vui lòng nhập tên sản phẩm",
			)
		)
	);
	
	/**
	 * @var $actsAs
	 * @brief Biến dùng để cấu hình
	 */
	
	var $actsAs = array(
		'Tree',
		'Sluggable'	=>	array(
			'label'	=>	'name',
			'alias'	=>	'alias'
		),
		'HasSingleImage'	=>	array(
			'image_field'	=>	'image'
		),
		'ExtendedTree',
		'ExtendedValidation',
		'ExtendedConfiguration'	=> array(
			'configFilename'		=>	'products.category_configs',
			'names'		=> array('Category', 'ManageCategory'),
			'merge'		=>	array(
				array(
					'settings'	=>	array(
						'configFilename'	=>	'categories.config',
						'names'				=>	array('Category', 'ManageCategory')
					),
				)
			),
			'cacheName'	=>	'products_categories_configs'
		),
		'Containable',
		'Translate'	=>	array('name'),
		'ExtendedTranslate'
	);
	var $hasAndBelongsToMany = array(
		'HomeProduct' => array(
			'className' => 'Product',
			'joinTable' => 'products_middle',
			'foreignKey' => 'category_id',
			'associationForeignKey' => 'page_id',
			'unique' => true,
			'conditions' => '',
			'fields' => '',
			'order' => '',
			'limit' => '',
			'offset' => '',
			'finderQuery' => '',
			'deleteQuery' => '',
			'insertQuery' => ''
		),
		'OrderProduct' => array(
			'className' => 'Product',
			'joinTable' => 'products_middle',
			'foreignKey' => 'category_id',
			'associationForeignKey' => 'page_id',
			'unique' => true,
			'conditions' => array('OrderProduct.is_published' => 1),
			'fields' => array('OrderProduct.title', 'OrderProduct.alias'),
			'order' => 'OrderProduct.priority desc, OrderProduct.created desc',
			'limit' => '',
			'offset' => '',
			'finderQuery' => '',
			'deleteQuery' => '',
			'insertQuery' => ''
		)
	);
	
	
	/**
	 * Phương thức được sử dụng để xóa hình ảnh khỏi ổ cứng, bao gồm hình chính và thumbnail nếu có
	 *
	 * @param $image_name Tên của file hình cần xóa
	 * @param $config Thông tin cấu hình nếu có (Không bắt buộc)
	 * @return Không trả về dữ liệu
	 */
	function delete_image($image_name, $config = array()) {
		if (isset($configs['image']['show']) && $this->configs['image']['show']) {
			if (!count($config)) {
				$config = $this->loadConfig();
			}
			// Xử lý để lấy tên thumbnail
			$ext = strrchr($image_name, ".");
			$pos = strrpos($image_name, ".");
			$filename = substr($image_name,0,$pos);
			$thumbnail_name = $filename."_thumbnail".$ext;
			if (is_file($config['Category']['image']['path'].$image_name)) {
				@unlink($config['Category']['image']['path'].$image_name);
				@unlink($config['Category']['thumbnail']['path'].$thumbnail_name);
			}
		}
	}
	
	/**
	 * Phương thức được sử dụng để xóa một danh mục và tất cả danh mục con của nó, bao gồm cả hình ảnh kèm theo
	 *
	 * @param $id ID của danh mục cần xóa
	 * @param $configs Thông tin cấu hình nếu có, được sử dụng để lấy đường dẫn hình ảnh cần xóa
	 * @exception Trong trường hợp không xóa được danh mục thì sẽ ném ra lỗi để người dùng biết
	 * @return Không trả về dữ liệu
	 */
	function deleteCategory($id, $configs) {
		$this->Behaviors->attach('Containable');
		$this->contain();
		$category_info = $this->read(array('lft','rght'), $id);
		
		if (!empty($category_info)) {
			$categories = $this->find('list', array(
				'conditions'	=>	array(
					"{$this->name}.lft >= ".$category_info[$this->name]['lft'],
					"{$this->name}.rght <= ".$category_info[$this->name]['rght'],
				),
				'fields'	=>	array('id', 'image')
			));
		}
		
		// Delete Category Record
		if ($this->delete($id)) {
			// Delete image in hard-disk
			foreach ($categories as $image) {
				$this->delete_image($image, $configs);
			}
		} else {
			throw new Exception (__("Không thể xóa danh mục. Vui lòng thử lại", true));
		}
	}
	
	function buildTree($root_id, $records, $indexName = 'Category') {
		foreach ($records as $item) {
			$children = isset($item['items']) ? $item['items'] : array(); 
			$item = $item[$indexName];
			$item['items'] = $children;

			$this->data[$this->name] = array(
				'name'			=>	$item['name'],
				'alias'			=>	$item['alias'],
				'parent_id'		=>	$root_id,
				'image'			=>	$item['image'],
				'description'	=>	$item['description']
			);
			//debug($this->data);exit;
			
			$this->create($this->data);
			$this->save($this->data);
			$lastInsertID = $this->getLastInsertID();
			
			if (isset($item['items']) && is_array($item['items'])) {
				$this->buildTree($lastInsertID, $item['items'], $indexName);
			}
		}
	}
	
	function getTopNews($catId, $fields, $limit, $offset=0) {
		// get categories info
		for ($catNo = 0; $catNo < count($cats); $catNo++) {
			$currentCat &= $cats[$catNo];
			
			
			// Select Top most Topics
			
			// Select next topics
		}
		
		return $cats;
	}
	
	
}
?>